const express = require('express');
const axios = require('axios');
const cheerio = require('cheerio');
const cors = require('cors');
const path = require('path');
require('dotenv').config();

const app = express();
const PORT = process.env.PORT || 3000;

// 中间件
app.use(cors());
app.use(express.json());
app.use(express.urlencoded({ extended: true }));

// 静态文件服务
app.use(express.static(path.join(__dirname, 'public')));

// 飞书API配置
const FEISHU_APP_ID = process.env.FEISHU_APP_ID;
const FEISHU_APP_SECRET = process.env.FEISHU_APP_SECRET;

// 从URL提取文档ID（支持更多格式）
function extractDocIdFromUrl(url) {
  // 尝试多种可能的文档ID提取模式
  const patterns = [
    /\/(docs|docx|wiki)\/([a-zA-Z0-9_-]+)/,  // 标准格式
    /\/document\/([a-zA-Z0-9_-]+)/,           // 可能的其他格式
    /\/doc\/([a-zA-Z0-9_-]+)/,               // 简化格式
    /[?&]docId=([a-zA-Z0-9_-]+)/,            // 查询参数格式
    /[?&]id=([a-zA-Z0-9_-]+)/                // 通用ID参数
  ];
  
  for (const pattern of patterns) {
    const match = url.match(pattern);
    if (match) {
      return match[match.length - 1]; // 返回最后一个捕获组
    }
  }
  
  return null;
}

// 获取飞书访问令牌
async function getFeishuAccessToken() {
  try {
    const response = await axios.post('https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal', {
      app_id: FEISHU_APP_ID,
      app_secret: FEISHU_APP_SECRET
    });
    
    if (response.data.code === 0) {
      return response.data.tenant_access_token;
    } else {
      throw new Error(`获取访问令牌失败: ${response.data.msg}`);
    }
  } catch (error) {
    throw new Error(`获取飞书访问令牌失败: ${error.message}`);
  }
}

// 获取飞书文档内容并转换为markdown
async function getFeishuDocAsMarkdown(docId, accessToken) {
  try {
    // 获取文档内容
    const response = await axios.get(`https://open.feishu.cn/open-apis/docx/v1/documents/${docId}/raw_content`, {
      headers: {
        'Authorization': `Bearer ${accessToken}`,
        'Content-Type': 'application/json'
      }
    });
    
    if (response.data.code === 0) {
      // 简单的文本到markdown转换
      const content = response.data.data.content;
      return convertToMarkdown(content);
    } else {
      throw new Error(`获取文档内容失败: ${response.data.msg}`);
    }
  } catch (error) {
    throw new Error(`获取飞书文档失败: ${error.message}`);
  }
}

// 简单的文本到markdown转换函数
function convertToMarkdown(content) {
  if (!content) return '';
  
  // 这里可以根据飞书文档的具体格式进行更复杂的转换
  // 目前只是简单处理
  let markdown = content;
  
  // 基本的格式转换
  markdown = markdown.replace(/\*\*(.*?)\*\*/g, '**$1**'); // 粗体
  markdown = markdown.replace(/\*(.*?)\*/g, '*$1*'); // 斜体
  
  return markdown;
}

// 获取网页源码
async function getWebPageContent(url) {
  try {
    const response = await axios.get(url, {
      headers: {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
      },
      timeout: 10000
    });
    
    return response.data;
  } catch (error) {
    throw new Error(`获取网页内容失败: ${error.message}`);
  }
}

// 主要的API端点
app.post('/extract', async (req, res) => {
  try {
    const { url } = req.body;
    
    if (!url) {
      return res.status(400).json({
        success: false,
        error: 'URL参数是必需的'
      });
    }
    
    // 验证URL格式
    try {
      new URL(url);
    } catch {
      return res.status(400).json({
        success: false,
        error: '无效的URL格式'
      });
    }
    
    // 统一先尝试作为飞书文档处理
    try {
      // 检查飞书API配置
      if (!FEISHU_APP_ID || !FEISHU_APP_SECRET) {
        console.log('飞书API配置缺失，跳过飞书文档处理，直接获取网页内容');
        throw new Error('飞书API配置缺失');
      }
      
      // 尝试提取文档ID
      const docId = extractDocIdFromUrl(url);
      if (!docId) {
        console.log('无法从URL中提取文档ID，尝试获取网页内容');
        throw new Error('无法提取文档ID');
      }
      
      console.log(`尝试作为飞书文档处理，文档ID: ${docId}`);
      
      // 尝试获取飞书访问令牌和文档内容
      const accessToken = await getFeishuAccessToken();
      const markdown = await getFeishuDocAsMarkdown(docId, accessToken);
      
      // 成功获取飞书文档内容
      res.json({
        success: true,
        type: 'feishu_markdown',
        content: markdown,
        url: url
      });
      
    } catch (feishuError) {
      // 飞书文档处理失败，尝试获取网页源码
      console.log(`飞书文档处理失败: ${feishuError.message}，尝试获取网页内容`);
      
      try {
        const htmlContent = await getWebPageContent(url);
        
        res.json({
          success: true,
          type: 'webpage_html',
          content: htmlContent,
          url: url
        });
        
      } catch (webError) {
        // 两种方式都失败了
        console.error('获取网页内容也失败:', webError.message);
        throw new Error(`无法获取内容。飞书文档处理失败: ${feishuError.message}；网页获取失败: ${webError.message}`);
      }
    }
    
  } catch (error) {
    console.error('处理请求时出错:', error);
    res.status(500).json({
      success: false,
      error: error.message
    });
  }
});

// 健康检查端点
app.get('/health', (req, res) => {
  res.json({ status: 'ok', timestamp: new Date().toISOString() });
});

// 根路径
app.get('/', (req, res) => {
  res.json({
    message: '飞书文档提取API服务',
    endpoints: {
      'POST /extract': '提取飞书文档或网页内容',
      'GET /health': '健康检查'
    },
    usage: {
      method: 'POST',
      url: '/extract',
      body: { url: 'https://example.com' }
    }
  });
});

// 启动服务器
app.listen(PORT, () => {
  console.log(`服务器运行在端口 ${PORT}`);
  console.log(`访问 http://localhost:${PORT} 查看API信息`);
});

module.exports = app;